/*
 * Copyright: 2018 smarabbit studio.
 *
 * Licensed under the Confluent Community License; you may not use this file
 * except in compliance with the License.  You may obtain a copy of the License at
 *
 * http://www.confluent.io/confluent-community-license
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OF ANY KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * @作   者： 黄开晖 (117227773@qq.com)
 * @日   期:  2019年2月24日
 */
package com.massyframework.beanskin.runtime.service.metadata;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

import com.massyframework.beanskin.service.metadata.FieldMetadata;

/**
 * 实现{@link FieldMetadata}的缺省类
 *
 */
final class DefaultFieldMetadata extends MetadataBase<Field> implements FieldMetadata {

	/**
	 * 构造方法
	 * @param original 字段
	 */
	public DefaultFieldMetadata(Field original) {
		super(original);
	}

	/* (non-Javadoc)
	 * @see com.massyframework.metadata.Metadata#getName()
	 */
	@Override
	public String getName() {
		return this.getOriginal().getName();
	}

	/* (non-Javadoc)
	 * @see com.massyframework.metadata.Metadata#findAnnotation(java.lang.Class)
	 */
	@Override
	public <A extends Annotation> A findAnnotation(Class<A> annoType) {
		return this.getOriginal().getDeclaredAnnotation(annoType);
	}

	/* (non-Javadoc)
	 * @see com.massyframework.metadata.Metadata#findAnnotations(java.lang.Class)
	 */
	@Override
	public <A extends Annotation> A[] findAnnotations(Class<A> annoType) {
		return this.getOriginal().getDeclaredAnnotationsByType(annoType);
	}

	/* (non-Javadoc)
	 * @see com.massyframework.metadata.FieldMetadata#getValue(java.lang.Object)
	 */
	@Override
	public Object getValue(Object target) throws IllegalArgumentException, IllegalAccessException {
		if (!this.getOriginal().isAccessible()) {
			this.getOriginal().setAccessible(true);
		}
		
		return this.getOriginal().get(target);
	}

	/* (non-Javadoc)
	 * @see com.massyframework.metadata.FieldMetadata#setValue(java.lang.Object, java.lang.Object)
	 */
	@Override
	public void setValue(Object target, Object fieldValue) throws IllegalArgumentException, IllegalAccessException {
		if (!this.getOriginal().isAccessible()) {
			this.getOriginal().setAccessible(true);
		}
		
		this.getOriginal().set(target, fieldValue);
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "DefaultFieldMetadata [field =" + this.getOriginal().toGenericString() + "]";
	}

	
}
